package pimmodel;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

/**
 * 
 * Interface IKontaktList:<br>
 * Das Interface zur Klasse KontaktList.
 * 
 * @author Thomas Schoenfeld
 * @version (20120909_01)
 *
 */
public interface IKontaktList {

	/**
	 * getKontaktliste 			gibt die Liste der Kontakte sortiert zurueck
	 * 
	 * @return					die Kontaktliste
	 */
	public abstract List<IKontakt> getKontaktliste();

	/**
	 * setKontaktliste			tauscht die alten gegen neue Kontaktdaten aus
	 * 
	 * @param	kontaktliste	die Liste mit den neuen Kontaktdaten
	 * 
	 * @throws	NullPointerException falls das uebergebene Objekt null ist.
	 * @throws	IllegalArgumentException falls ein Listenelement nicht vom Typ IKontakt ist.
	 */
	public abstract void setKontaktliste(List<IKontakt> kontaktliste);

	/**
	 * kontaktErsetzen			ersetzt alten durch neuen Kontakt in der Liste
	 * 
	 * @param	bearKont		bearbeiteter Kontakt
	 * @param	orgKont			urspruenglicher Kontakt
	 * 
	 * @return					true falls Ersetzen erfolgt, false sonst 
	 * 
	 * @throws					IllegalArgumentException falls die uebergebenen Objekte nicht vom Typ IKontakt sind.
	 */
	public abstract boolean kontaktErsetzen(IKontakt bearKont, IKontakt orgKont);

	/**
	 * kontaktHinzufuegen		fuegt einen Kontakt der Liste hinzu
	 * 
	 * @param	neuKont			neuer Kontakt
	 * 
	 * @return					true falls Hinzufuegen erfolgt, false sonst
	 * 
	 * @throws					IllegalArgumentException falls das uebergebene Objekt nicht vom Typ IKontakt ist.
	 */
	public abstract boolean kontaktHinzufuegen(IKontakt neuKont);

	/** 
	 * kontaktLoeschen			loescht einen Kontakt in der Liste
	 * 
	 * @param	loeschKont		zu loeschender Kontakt
	 * 
	 * @return					true falls Loeschung erfolgt, false sonst
	 * 
	 * @throws					IllegalArgumentException falls das uebergebene Objekt nicht vom Typ IKontakt ist.
	 */
	public abstract boolean kontaktLoeschen(IKontakt loeschKont);

	/**
	 * kontaktLiefern			sucht einen Index und gibt Objekt vom Typ IKontakt zurueck
	 * 
	 * @param	index			der zu suchende Index
	 * 
	 * @return					der gefundene Kontakt oder null, falls Suche erfolglos
	 * 	
	 * @throws					IndexOutOfBoundsException falls der uebergebene Index ausserhalb der Datenstruktur liegt.
	 */
	public abstract IKontakt kontaktLiefern(int index);

	/**
	 * kontaktNameSuchen		sucht einen Kontaktnamen und gibt Index zurueck
	 * 
	 * @param	kontaktName		der zu suchende Kontaktname
	 * 
	 * @return					der ermittelte Index oder -1 falls nicht gefunden 
	 * 
	 * @throws					IllegalArgumentException falls kein gueltiger String uebergeben wurde	
	 */
	public abstract int kontaktNameSuchen(String kontaktName);

	/**
	 * kontaktSuchen			sucht einen Kontakt
	 * 
	 * @param	suchKontakt		der zu suchende Kontakt	
	 * 
	 * @return					der ermittelte Index oder -1 falls nicht gefunden
	 * 
	 * @throws					IllegalArgumentException falls das uebergebene Objekte nicht vom Typ IKontakt ist.
	 */
	public abstract int kontaktSuchen(IKontakt suchKontakt);

	/**
	 * toArray					wandelt Liste in Array um und gibt dieses zurueck
	 * 
	 * @return					das erzeugte Array
	 */
	public abstract Object[] toArray();

	/**
	 * clear					loescht alle Kontakte
	 */
	public abstract void clear();

	/**
	 * clone					liefert flache Kopie der Kontaktliste
	 * 
	 * @return					flache Kopie der Kontaktliste
	 */
	public abstract IKontaktList clone();

	/**
	 * isEmpty					prueft, ob die Kontaktliste leer ist
	 * 
	 * @return					true falls leer, false sonst
	 */
	public abstract boolean isEmpty();

	/**
	 * size						gibt die Anzahl der Elemente in der Liste zurueck
	 * 
	 * @return					die Anzahl der Listenelemente
	 */
	public abstract int size();

	/**
	 * toString					gibt Objektbeschreibung als String zurueck
	 * 
	 * @return					die Objektbeschreibung als String
	 */
	public abstract String toString();

	/**
	 * hashCode					liefert den Hashcode des Objekts als Integer zurueck
	 * 
	 * @return					den Hashcode des Objekts
	 * 
	 * @overrides				hashCode()
	 */
	public abstract int hashCode();

	/**
	 * equals					untersucht das Objekt mit einem uebergebenen Objekt auf Gleichheit
	 * 
	 * @param	obj				das mit diesem Objekt zu vergleichende Objekt
	 * 
	 * @return					true bei Gleichheit, sonst false
	 * 
	 * @overrides				equals()
	 */
	public abstract boolean equals(Object obj);

	/*
	 * (non-Javadoc)
	 * 
	 * @see pimmodel.IKontaktList#speichern()
	 */
	public abstract void speichern() throws FileNotFoundException, IOException;

	/*
	 * (non-Javadoc)
	 * 
	 * @see pimmodel.IKontaktList#laden()
	 */
	public abstract void laden() throws IOException, ClassNotFoundException;

}